In [1]:
from fnmatch import fnmatch, fnmatchcase
fnmatch("foo.txt", "*.txt")
Out[1]:
In [2]:
fnmatch("foo.txt", "?oo.txt")
Out[2]:
In [3]:
fnmatch("Dat45.csv", "Dat[0-9]*")
Out[3]:
In [4]:
names = ["Dat1.csv", "Dat2.csv", "config.ini", "foo.py"]
[name for name in names if fnmatch(name, "Dat*.csv")]
Out[4]:
fnmatch()
函数使用底层操作系统的大小写敏感规则(不同的系统是不一样的)来匹配模式。比如:
In [5]:
# False On OS X (Mac)
# True On Windows
fnmatch("foo.txt", "*.TXT")
Out[5]:
如果你对这个区别很在意,可以使用 fnmatchcase()
来代替。它完全使用你的模式大小写匹配。比如:
In [6]:
fnmatchcase("foo.txt", "*.TXT")
Out[6]:
这两个函数通常会被忽略的一个特性是在处理非文件名的字符串时候它们也是很有用的。 比如,假设你有一个街道地址的列表数据:
In [7]:
addresses = [
'5412 N CLARK ST',
'1060 W ADDISON ST',
'1039 W GRANVILLE AVE',
'2122 N CLARK ST',
'4802 N BROADWAY',
]
你可以像这样写列表推导:
In [8]:
from fnmatch import fnmatchcase
[addr for addr in addresses if fnmatchcase(addr, "* ST")]
Out[8]:
In [9]:
[addr for addr in addresses if fnmatchcase(addr, "54[0-9][0-9] *CLARK*")]
Out[9]:
讨论
fnmatch()
函数匹配能力介于简单的字符串方法和强大的正则表达式之间。 如果在数据处理操作中只需要简单的通配符就能完成的时候,这通常是一个比较合理的方案。
如果你的代码需要做文件名的匹配,最好使用 glob
模块。参考 5.13
小节。